home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000
/
Ham Radio 2000.iso
/
ham2000
/
packet
/
monax25
/
cdtmr.asm
< prev
next >
Wrap
Assembly Source File
|
1987-10-19
|
4KB
|
181 lines
;
;This module samples the TNC CD line 18.2 times a second.
;One long counter is incremented when the CD line is found active,
;another counter is incremented if the CD line is inactive.
;
; This module is part of stats.exe
;
; Hardware: IBM PC or compatable serial port (8250)
;
; Language = Microsoft Macro Assembler version 4.0
;
; This source is distributed freely and may be copied and
; redistributed with the following provisos:
;
; You may not sell it, nor may you charge for making
; copies beyond the actual cost of mailing and media.
;
; Written by Skip Hansen WB6YMH and Harold Price NK6K.
;
; Feedback is desired.
;
; RCP/M (213) 541-2503 300/1200/2400 baud
; or via packet WB6YMH @ WB6YMH-2 or
; NK6K @ NK6K
;
; Modification history:
;
; 8/10/87 WB6YMH: Initial release.
; ver 1.0
;
;
;macro to increment a long integer
;
bump macro variable
local next ;
inc word ptr variable ;
jnz next ;
inc word ptr variable+2 ;
next:
endm
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BBS SEGMENT WORD PUBLIC 'BBS'
_BBS ENDS
subttl Data Areas
page
DGROUP GROUP CONST, _BBS, _DATA
ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP
_DATA SEGMENT
extrn port_base:word
_DATA ENDS
_TEXT SEGMENT
base dw ? ;base adr of com port in use
old_8 dd ? ;old interrupt 8 vector
cd_active dd 0 ;
cd_inactive dd 0 ;
;
;Intercept 18.2 hz ticker for CD timing
;
public _tick_init
_tick_init: push bp ;save registers
push si ;
push di ;
push es ;
push ds ;
mov ah,35h ;get old ticker interrupt
mov al,8 ;
int 21h ;
mov word ptr cs:old_8,bx ;save old interrupt vector
mov word ptr cs:old_8+2,es ;
mov ax,cs ;set up ds
mov ds,ax ;
mov ah,25h ;set our interrupt
mov al,8 ;
mov dx,offset int8_hdlr ;
int 21h ;
pop ds ;restore registers
pop es ;
pop di ;
pop si ;
pop bp ;
ret ;
;
;Remove cd sampler from int 8 chain
;
public _tick_stop
_tick_stop: push bp ;save registers
push si ;
push di ;
push ds ;
mov dx,word ptr cs:old_8 ;get old interrupt vector
mov ax,word ptr cs:old_8+2 ;
mov ds,ax ;set up dx
mov ah,25h ;reset old interrupt
mov al,8 ;
int 21h ;
pop ds ;restore registers
pop di ;
pop si ;
pop bp ;
ret ;
;
;Save COM port base address for background program
;
public _set_base
_set_base: push bp ;save BP
mov bp,sp ;point to passed parms
mov ax,[bp+4] ;get base adr
mov cs:base,ax ;save for interrupt handler
pop bp ;
ret ;
;
;Ticker interrupt handler. Sample current state of CD line and
;increment appropriate counter.
;
int8_hdlr: push ax ;save registers
push dx ;
mov dx,cs:base ;
add dx,6 ;point to modem status register
in al,dx ;
and al,80h ;CD active ?
jnz inactive ;jump if not
bump cs:cd_active ;
jmp chain_nxt ;continue
inactive: bump cs:cd_inactive ;
chain_nxt: pop dx ;restore registers
pop ax ;
jmp cs:old_8 ;chain to next handler in line
;
;Read and clear the cd_active variable
;
public _get_cd_active
_get_cd_active: mov ax,word ptr cs:cd_active ;get lsb
mov dx,word ptr cs:cd_active+2 ;and msb
mov word ptr cs:cd_active,0 ;clear counter
mov word ptr cs:cd_active+2,0 ;
ret ;
;
;Read and clear the cd_inactive variable
;
public _get_cd_inactive
_get_cd_inactive:
mov ax,word ptr cs:cd_inactive ;get lsb
mov dx,word ptr cs:cd_inactive+2 ;and msb
mov word ptr cs:cd_inactive,0 ;clear counter
mov word ptr cs:cd_inactive+2,0 ;
ret ;
_TEXT ENDS
end